Game Simulation

전략 패턴과 템플릿 메서드 패턴의 차이점은
전략 패턴이 컴포지션(정적 or 동적)을 이용하는 반면,
템플릿 메서드 패턴은 상속을 이용한다.

전략 패턴, 템플릿 메서드 패턴 모두 알고리즘의 골격을 정의해두고 상세 구현을 다른 곳에 둔다는 점은
동일하다.
class Game{
private:
void run(){
start();
while(!have_winner()) take_turn();
cout<<"Player "<<get_winner()<<" wins.\n";
}
public:
explicit Game(int number_of_players): number_of_players(number_of_players){}
protected:
virtual void start=0;
virtual bool have_winner()=0;
virtual void take_turn()=0;
virtual int get_winner()=0;
int current_player{0};
int number_of_players;
};
class Chess: public Game{
public:
explicit Chess(): Game{2} {}
protected:
void start() override {}
bool have_winner() override {
return turns==max_turns;
}
void take_turn() override {
turns++;
current_player=(current_player+1)%number_of_players;
}
int get_winner() override { return current_player; }
private:
int turns{0}, max_turns{10};
};
전략 패턴에서는 콤포지션을 사용하여 동적 전략과 정적 전략을 선택해서 사용할 수 있다.
하지만, 템플릿 메서드는 상속을 이용하기 때문에 정적인 방법만 존재한다.
(생성된 객체의 부모를 동적으로 바꿀 수 없기 때문에 상속을 사용하면, 정적인 방법임)

템플릿 메서드 방법에서 이용될 메서드를 pure virtual로 할 것인지, 실 구현체로 할 것인지(공백함수 포함)를
선택할 수 있다.